load(":toolchain.bzl", "emscripten_cc_toolchain_config_rule")

package(default_visibility = ["//visibility:public"])

filegroup(
    name = "common_files",
    srcs = [
        "emscripten_config",
        "env.sh",
        "env.bat",
        "@nodejs//:node_files",
    ],
)

filegroup(
    name = "compiler_files",
    srcs = [
        "emcc.sh",
        "emcc.bat",
        "@emsdk//:compiler_files",
        ":common_files",
    ],
)

filegroup(
    name = "linker_files",
    srcs = [
        "emcc_link.sh",
        "emcc_link.bat",
        "link_wrapper.py",
        "@emsdk//:linker_files",
        ":common_files",
    ],
)

filegroup(
    name = "ar_files",
    srcs = [
        "emar.sh",
        "emar.bat",
        "@emsdk//:ar_files",
        ":common_files",
    ],
)

filegroup(name = "empty")

# dlmalloc.bc is implictly added by the emscripten toolchain
cc_library(name = "malloc")

emscripten_cc_toolchain_config_rule(
    name = "wasm",
    cpu = "wasm",
    em_config = "emscripten_config",
    emscripten_binaries = "@emsdk//:compiler_files",
    script_extension = select({
        "@bazel_tools//src/conditions:host_windows": "bat",
        "//conditions:default": "sh",
    }),
)

cc_toolchain(
    name = "cc-compiler-wasm",
    all_files = ":empty",
    ar_files = ":ar_files",
    as_files = ":empty",
    compiler_files = ":compiler_files",
    dwp_files = ":empty",
    linker_files = ":linker_files",
    objcopy_files = ":empty",
    strip_files = ":empty",
    toolchain_config = "wasm",
    toolchain_identifier = "emscripten-wasm",
)

cc_toolchain_suite(
    name = "everything",
    toolchains = {
        "wasm": ":cc-compiler-wasm",
        "wasm|emscripten": ":cc-compiler-wasm",
    },
)

toolchain(
    name = "cc-toolchain-wasm",
    target_compatible_with = ["@platforms//cpu:wasm32"],
    toolchain = ":cc-compiler-wasm",
    toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)

py_binary(
    name = "wasm_binary",
    srcs = ["wasm_binary.py"],
)
